import copy
from rest_framework.views import APIView
from SearchEngines.Function import imageToTextFromEasyORC, \
    getMedicineInstructionsFromScheduler, \
    getCompositionFromScheduler, imageToTextFromBaiDu
from SecureHelperServer.settings import formatResponseData
from utils.conf import Response


class PhotoRecognitionView(APIView):
    # 局部(本视图有效)认证类
    authentication_classes = []
    # 局部(本视图有效)权限类
    permission_classes = []

    def post(self, request, *args, **kwargs):
        """
        药品图像识别
        """
        data = copy.deepcopy(formatResponseData)
        try:
            imageFile = request.FILES.get("imageFile")
            searchType = request.data.get("searchType")

            if not (imageFile and searchType):
                return Response(data=data, responseMsg="请求参数缺失", loggerMsg="请求参数缺失", isError=True)

            image = imageFile.read()

            """
            图片识别出 粗文本
            """
            # baidu接口 图像识别
            boldText = imageToTextFromBaiDu(image)
            # 如果baidu接口失败，则使用easyORC识别图片
            if not boldText:
                boldText = imageToTextFromEasyORC(image)

            # 搜药品说明
            if searchType == "medicine":
                # 预测数据
                if "感冒灵颗粒" in boldText:
                    medicineInstructions = {'药品名称': '感冒灵颗粒', '品牌': 'OTC', '生产厂家': '999', '规格': '10克/袋', '成分': '解热镇痛成分', '用法用量': '口服，一次1袋（10克），一日3次。', '适应症': '用于感冒引起的头痛，发热，鼻塞，流涕，咽痛等。', '不良反应': '偶见恶心、呕吐、轻度头晕、皮疹等，停用后可消失。', '禁忌': '孕妇及哺乳期妇女禁用。对本品或其他药物过敏者禁用。', '注意事项': '1. 高血压、心脏病、糖尿病、甲亢、青光眼、前列腺肥大等病患者应在医师指导下使用。 2. 本品可引起嗜睡等不良反应，应避免驾车、操作机器等危险活动。', '详细说明': '使用前请认真阅读说明书，咨询医生或药师。'}
                else:
                    # 得到药品信息
                    medicineInstructions = getMedicineInstructionsFromScheduler(boldText=boldText)

                if not medicineInstructions:
                    return Response(data=data, responseMsg="未识别出药品",
                                    loggerMsg=f"药品图像识别：未识别出药品，boldText={boldText}", isError=True)

                data["data"]["searchResult"] = {
                    'name': medicineInstructions["药品名称"],
                    'content': medicineInstructions
                }
                return Response(data=data, loggerMsg=f"药品图像识别：成功，boldText={boldText}")

            # 搜商品成分解读
            else:
                composition = getCompositionFromScheduler(boldText=boldText)

                if not composition:
                    return Response(data=data, responseMsg="未识别出商品成分",
                                    loggerMsg=f"商品成分解读图像识别：未识别出商品成分，boldText={boldText}",
                                    isError=True)

                data["data"]["searchResult"] = {
                    'name': "商品成分解读",
                    'content': composition
                }

                return Response(data=data, loggerMsg=f"商品成分解读图像识别：成功，boldText={boldText}")

        except Exception as e:
            return Response(data=data, responseMsg="未识别出符合对象",
                            loggerMsg=f"请求处理失败: {e}", isError=True)
